label: Improve link styling
authorMatthias Clasen <mclasen@redhat.com>
Fri, 10 Apr 2020 01:15:30 +0000 (21:15 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 10 Apr 2020 01:19:22 +0000 (21:19 -0400)
Add a .link style class on labels that contain links,
so we can avoid the focus outline around the label
when individual links are focused, and use the link
node when rendering the focus on links.

gtk/gtklabel.c

index 42ccc00b3f467d7465bc51a77c0017ca79a75b8f..10067567430c13480a688debac0566e598186a83 100644 (file)
@@ -95,7 +95,7 @@
  *
  * If the label has links, there is one subnode per link. These subnodes
  * carry the link or visited state depending on whether they have been
- * visited.
+ * visited. In this case, label node also gets a .link style class.
  *
  * # GtkLabel as GtkBuildable
  *
@@ -2325,6 +2325,7 @@ gtk_label_set_markup_internal (GtkLabel    *label,
       priv->select_info->links = g_list_reverse (links);
       _gtk_label_accessible_update_links (label);
       gtk_label_ensure_has_tooltip (label);
+      gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (label)), "link");
     }
 
   if (with_uline)
@@ -3677,12 +3678,16 @@ gtk_label_snapshot (GtkWidget   *widget,
               range[0] = focus_link->start;
               range[1] = focus_link->end;
 
+              gtk_style_context_save_to_node (context, focus_link->cssnode);
+
               range_clip = gdk_pango_layout_get_clip_region (priv->layout, lx, ly, range, 1);
               cairo_region_get_extents (range_clip, &rect);
 
               gtk_snapshot_render_focus (snapshot, context, rect.x, rect.y, rect.width, rect.height);
 
               cairo_region_destroy (range_clip);
+
+              gtk_style_context_restore (context);
             }
         }
     }
@@ -5795,6 +5800,7 @@ gtk_label_clear_links (GtkLabel *label)
   g_list_free_full (priv->select_info->links, (GDestroyNotify) link_free);
   priv->select_info->links = NULL;
   priv->select_info->active_link = NULL;
+  gtk_style_context_remove_class (gtk_widget_get_style_context (GTK_WIDGET (label)), "link");
 
   _gtk_label_accessible_update_links (label);
 }